class Solution {
//    给定一个数组，包含从 1 到 N 所有的整数，但其中缺了两个数字。你能在 O(N) 时间内只用 O(1) 的空间找到它们吗？
//    以任意顺序返回这两个数字均可。
//    示例 1:
//    输入: [1]
//    输出: [2,3]
//    示例 2:
//    输入: [2,3]
//    输出: [1,4]
    public int[] missingTwo(int[] nums) {
        int len = nums.length;
        int group = 0;
        for(int x : nums){
            group ^= x;
        }
        for(int i = 1; i <= len + 2; i++){
            group ^= i;
        }
        //此时找的group可以作为数据分组的依据
        //找到group的最后一个为1的位
        group &= (-group);
        int[] ret = new int[2];
        for(int x : nums){
            if((x & group) == 0){
                ret[0] ^= x;
            }else{
                ret[1] ^= x;
            }
        }
        for(int i = 1; i <= len + 2; i++){
            if((i & group) == 0){
                ret[0] ^= i;
            }else{
                ret[1] ^= i;
            }
        }
        return ret;
    }
}
